package com.bbx.aliyunapi.controller;

import com.aliyun.ecs20140526.Client;
import com.bbx.aliyunapi.config.EcsClientConfig;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;


import com.aliyun.ecs20140526.models.*;


/**
 *
 */
@Slf4j
@RequestMapping("/aliyun/ecs")
@RestController
public class EcsModifyController {


    /**
     * 需要设置访问权限的源端IPv4 CIDR地址块
     */
    private String SourceCidrIp;
    /**
     * 传输层协议。取值大小写敏感。取值范围：
     * <p>
     * tcp
     * udp
     * icmp
     * gre
     * all：支持所有协议
     */
    private String ipProtocol = "tcp";

    /**
     * 目的端安全组开放的传输层协议相关的端口范围。取值范围：
     * <p>
     * TCP/UDP协议：取值范围为1~65535。使用斜线（/）隔开起始端口和终止端口。例如：1/200
     * ICMP协议：-1/-1
     * GRE协议：-1/-1
     * IpProtocol取值为all：-1/-1
     */
    private String portRange = "1/65535";

    /**
     * 经典网络类型安全组规则的网卡类型。取值范围：
     * <p>
     * internet：公网网卡。
     * intranet：内网网卡。
     * 专有网络VPC类型安全组规则无需设置网卡类型，默认为intranet，只能为intranet。
     * 设置安全组之间互相访问时，即仅指定了SourceGroupId参数时，只能为intranet。
     * 默认值：internet
     */
    private String nicType = "internet";
    /**
     * 设置访问权限。取值范围：
     * <p>
     * accept（默认）：接受访问。
     * drop：拒绝访问，不返回拒绝信息，表现为发起端请求超时或者无法建立连接的类似信息。
     */
    private String policy = "accept";


    @Value("${aliyun.regionId}")
    private String regionId;

    @Autowired
    private EcsClientConfig clientConfig;


    /**
     * 安全组 增加一条入方向安全组规则
     *
     * @param securityGroupId : 安全组ID
     * @param ip              需要设置访问权限的源端IPv4 CIDR地址块   例如：192.168.1.1:32
     * @param port            端口范围 TCP/UDP协议：取值范围为1~65535。使用斜线（/）隔开起始端口和终止端口。例如：1/200
     *                        ICMP协议：-1/-1
     *                        GRE协议：-1/-1
     *                        IpProtocol取值为all：-1/-1
     * @return
     * @throws Exception
     */
    @RequestMapping("/add")
    public String addIP(String securityGroupId, String ip, String port) throws Exception {
        log.info("/aliyun/ecs/add~~~~~~~~~~~~~~securityGroupId[{}],ip[{}],port[{}]", securityGroupId, ip, port);
        SourceCidrIp = ip;
        portRange = port;
        //获取client
        Client client = clientConfig.getClient();
        //获取区域范围
//        String regionId = ClientConfig.getRegionId(client);
        log.info("regionId[{}]", regionId);

        //增加一条入方向安全组规则
        AuthorizeSecurityGroupRequest authorizeSecurityGroupRequest = new AuthorizeSecurityGroupRequest()
                .setSecurityGroupId(securityGroupId)
                .setSourceCidrIp(SourceCidrIp)
                .setIpProtocol(ipProtocol)
                .setPortRange(portRange)
                .setNicType(nicType)
                .setPolicy(policy)
                .setRegionId(regionId);
        client.authorizeSecurityGroup(authorizeSecurityGroupRequest);
        return "success";
    }


    /**
     * 安全组 删除一条入方向安全组规则
     * @param securityGroupId
     * @param ip
     * @param port
     * @return
     * @throws Exception
     */
    @RequestMapping("/delete")
    public String delete(String securityGroupId, String ip, String port) throws Exception {
        log.info("/aliyun/ecs/add~~~~~~~~~~  securityGroupId[{}],ip[{}],port[{}]", securityGroupId, ip, port);
        SourceCidrIp = ip;
        portRange = port;
        //获取client
        Client client = clientConfig.getClient();
        //获取区域范围
//        String regionId = ClientConfig.getRegionId(client);

        //删除一条入方向安全规则
        RevokeSecurityGroupRequest revokeSecurityGroupRequest = new RevokeSecurityGroupRequest()
                .setSecurityGroupId(securityGroupId)
                .setSourceCidrIp(SourceCidrIp)
                .setIpProtocol(ipProtocol)
                .setPortRange(portRange)
                .setRegionId(regionId);

        client.revokeSecurityGroup(revokeSecurityGroupRequest);
        return "success";
    }



}


